/***********************************************************************************
@file   
@author
@attention
//---------运行参考功耗
正常运行不开传感器使能5.5ma
正常运行不开传感器使能进入睡眠模式4.9ma
正常运行不开传感器使能进入深度睡眠模式4.0ma
//---------外设功耗1 4.2电压
霍尔                  5ua//正常和磁铁激活后一样功耗
传感器                19ma
绿灯                  70ua
黄灯                  0.8ma 
红灯                  0.5ma
红外R管               0.32ma
SGM6603静态功耗       0.5ma
LORA                  -- <0.1ma
//---------外设功耗2
深度睡眠 4.2供电 4.1ma  3.3V供电去除LDO 1.1V 
//---------测试
4.214 空载  2.024跟随器  测试电压2.1339 输出1.1V   
输出最高4.208轨到轨，2.443V  ,8mv/1%,±35mv零点漂移
//---------测试

外设初始化大约0.5ma,全部IO口引脚2-3ma lcd_port_init();模拟输出口 0.04ma
***********************************************************************************/
#include "sleep.h"
/***********************************************************************************
 * @param
***********************************************************************************/
_sleep_obj sleep_obj;

/***********************************************************************************
* @brief  设备睡眠时间切换检测
          浓度超过一定值,RTC唤醒时间由15s改为3s
***********************************************************************************/
void sleep_time_check(void)
{
    if(mydata>=system_data.hot_number)
    {
        rtc_config_init(5);   
    }
    else
    {
        rtc_config_init(30);
    }
}
/***********************************************************************************
* @brief  设备进入休眠
***********************************************************************************/
void sleep_goto_deinit(void)
{
    //--------------------------------//睡眠前最后一次同步状态

    system_adc_update();
    system_data_process();
    system_data_process_sleep();
    page_goto(PAGE_DIS_MAIN);//返回主界面  
    page_dis_update();
    led_control(status);
    led_syn_status(status);
   
    #if(defined(HARD_WARE)&&(HARD_WARE==HARD_WARE_FIRST))
    speak_exe_fsm();
    #else
    adxl345_process();
    wt588_process();    
    #endif
    lora_send_message(0);
    //--------------------------------//检查睡眠计时
    #if(defined(HARD_WARE)&&(HARD_WARE==HARD_WARE_FIRST))
    #else
    if(sleep_obj.tim_cnt!=0)
    {
        sleep_update_state(2);//转到运行
        return;
    }
    #endif
    //--------------------------------//同步完成 关闭模块
    infrared_en(0);
    sensor_en(0); 
    adc_deinit();
    infared_gpio_deinit();
    button_gpio_deinit();     
    sleep_time_check();
    printf("device_goto_sleep\r\n");
    #if(defined(HARD_WARE)&&(HARD_WARE==HARD_WARE_FIRST))
     delay1ms(1);//4M延时1ms  24M延时5ms
    #else
    delay1ms(1);//4M延时1ms  24M延时5ms
    wt588_goto_sleep(); 
    #endif
    Lpm_GotoDeepSleep(FALSE);     
}	
/***********************************************************************************
* @brief  设备唤醒初始化
***********************************************************************************/
void sleep_wakeup_init(void)
{
    adc_init();
    delay1ms(1);
    infared_gpio_init();
    button_gpio_init();
    infrared_en(1);          
}
/***********************************************************************************
* @brief  设备唤醒运行
***********************************************************************************/
void sleep_wakeup_run(void)
{
    infared_process();//红外按键流程        
    
    button_run();
    system_data_process();
    system_power_status();
    #if(defined(HARD_WARE)&&(HARD_WARE==HARD_WARE_FIRST))
    speak_exe_fsm();
    #else
    adxl345_process();
    wt588_process();    
    #endif
    page_dis_update();//页面更新  
    led_control(status);
//    printf("sensor_vol:%d\r\n",adc_obj.sensor_vol);
    lora_send_config();
    lora_send_message(0);   
    Wdt_Feed();    
    if(sleep_obj.tim_cnt==0)
    {
        sleep_update_state(3);
    }
}
/***********************************************************************************
* @brief  执行状态机   main : sleep_exe_fsm(sleep_obj.exe_fsm_state);
          0  空闲
          1  唤醒初始化
          2  正常运行
          3  进入休眠
***********************************************************************************/
void sleep_exe_fsm(uint8_t state)	
{
    switch (state)
    {
        case 0: sleep_update_state(1); break;        
        case 1: sleep_update_state(2);
                sleep_wakeup_init();   break;   
        case 2: sleep_wakeup_run();    break;        
        case 3: sleep_goto_deinit();   break;	   
        default:break;		
    }
}
/***********************************************************************************
* @brief  
***********************************************************************************/
void sleep_timer(void)	
{
    //------------------------正常工作定时器
    if(sleep_obj.tim_cnt)
    {       
        sleep_obj.tim_cnt--; 
        if(display_page==PAGE_SET_CAL && sleep_obj.tim_cnt==1000)
        {
            infared_virtual_key();   
        }            
    }
    //------------------------传感器工作定时器
    if(sleep_obj.sensor_cnt)
    {
        sensor_en(1);
        infrared_en(1);        
        sleep_obj.sensor_cnt--;    
        //RTC后更新
        if(sleep_obj.sensor_cnt==2)//等待数据稳定
        {
          system_adc_update();          
        }
        //预热后更新,1S更新一次
        if(sleep_obj.sensor_cnt>RTC_WAKEUP_TIME &&\
           sleep_obj.sensor_cnt%100==0)
        {
          system_adc_update();    
        }
    }
    if(sleep_obj.sensor_cnt==0)//非休眠时关闭
    {
         sensor_en(0); 
    }
}
/***********************************************************************************
* @brief  唤醒时赋予设备运行时间   SPAN_WAKEUP_TIME
***********************************************************************************/
void sleep_device_operation_time(uint32_t cnt)
{
    uint32_t max_cnt;
//    printf("sleep time = %d\r\n",cnt);
    sleep_update_state(1);
    max_cnt = sleep_obj.tim_cnt;
    if(cnt>max_cnt)
        max_cnt = cnt;
    sleep_obj.tim_cnt = max_cnt; 
}
/***********************************************************************************
* @brief  强制更新设备运行时间，用于标定确认和退出
***********************************************************************************/
void sleep_device_update_time(uint32_t cnt)
{
    sleep_update_state(1);
    sleep_obj.tim_cnt = cnt; 
}
/***********************************************************************************
* @brief  运行时正常延时设备运行时间
***********************************************************************************/
void sleep_device_operation_time1(uint32_t cnt)
{
    uint32_t max_cnt;

    max_cnt = sleep_obj.tim_cnt;
    if(cnt>max_cnt)
        max_cnt = cnt;
    sleep_obj.tim_cnt = max_cnt; 
}

/***********************************************************************************
* @brief  唤醒时赋予传感器运行时间
***********************************************************************************/
void sleep_sensor_operation_time(uint32_t cnt)
{
    uint32_t max_cnt;
    
    sensor_en(1);
    infrared_en(1);
    max_cnt = sleep_obj.sensor_cnt;
    if(cnt>max_cnt)
        max_cnt = cnt;
    sleep_obj.sensor_cnt = max_cnt; 
}
/***********************************************************************************
* @brief  更新运行状态
***********************************************************************************/
void sleep_update_state(uint8_t state)
{
    sleep_obj.last_fsm_state = sleep_obj.now_fsm_state;
    sleep_obj.now_fsm_state = state;
}